<?php

class Application_Model_Produtos {

    private $dbTable = NULL;

    public function __construct() {
        $this->dbTable = new Application_Model_DbTable_Produtos();
    }

    public function save(Application_Model_DAO_Produtos $produto) {
        require_once 'models/DAL/TamanhosHasProdutos.php';
        require_once 'models/DAL/CoresProdutosHasProdutos.php';
        $db = $this->dbTable;
        $return = NULL;

        $id = $produto->getIdProdutos();

        $data = array(
            'nome' => $produto->getNome(),
            'codigo' => $produto->getCodigo(),
            'descricao' => $produto->getDescricao(),
            'status' => $produto->getStatus() ? 1 : 0,
            'idLinha' => $produto->getLinhas()->getIdLinha(),
            'idCategoria' => $produto->getCategoria()->getIdCategoria()
        );

        if (!isset($id)) {
            $id = $db->insert($data);


            $modelTHP = new Application_Model_TamanhosHasProdutos();
            foreach ($produto->getTamanhos() as $tamanho) {
                $tamanhosHasProdutos = new Application_Model_DAO_TamanhosHasProdutos;
                $tamanhosHasProdutos->setIdProdutos($id);
                $tamanhosHasProdutos->setIdTamanhos($tamanho->getIdTamanhos());
                $modelTHP->save($tamanhosHasProdutos);
            }
            $modelCHP = new Application_Model_CoresProdutosHasProdutos();
            foreach ($produto->getCores() as $cor) {
                $coresProdutoHasProdutos = new Application_Model_DAO_CoresProdutosHasProdutos();
                $coresProdutoHasProdutos->setIdCoresProduto($cor->getIdCores());
                $coresProdutoHasProdutos->setIdProdutos($id);

                $modelCHP->save($coresProdutoHasProdutos);
            }
        } else if (isset($id)) {
            $return = $db->update($data, 'idProdutos = ' . (int) $produto->getIdProdutos());
        }

        $files = $produto->getFiles();

        $modelImg = new Application_Model_ImagePathProdutos();
        foreach ($files['error'] as $key => $error) {


            if ($error === UPLOAD_ERR_OK) {

                $ext = end(explode('.', $files['name'][$key]));


                $new_name = strtolower($ext . date('simYms') . str_replace(array('-', '.' . $ext, '_', '/tmp/', ' '), '', $files['name'][$key])) . '_big.' . $ext;
                $final_path = APPLICATION_PATH . '/../public/imgs/produtos/' . $new_name;

                $img = new Application_Model_DAO_ImagePathProdutos();
                $img->setCodProduto($id);
                $img->setPath(BASE_IMG . 'produtos/' . $new_name);

                if ($modelImg->save($img)) {
                    if (!is_dir(APPLICATION_PATH . '/../public/imgs/produtos/')) {
                        mkdir(APPLICATION_PATH . '/../public/imgs/produtos/');
                        chmod(APPLICATION_PATH . '/../public/imgs/produtos/', 0777);
                    }
                    move_uploaded_file($files['tmp_name'][$key], $final_path);
                    require_once 'WideImage/WideImage.php';

                    WideImage::load($final_path)->resize(1000, 860)->saveToFile($final_path);
                    WideImage::load($final_path)->resize(393, 338)->saveToFile(str_replace('_big', '_small', $final_path));
                    WideImage::load($final_path)->resize(90, 90)->saveToFile(str_replace('_big', '_thumb', $final_path));
                }
            }
        }
        return $id;
    }

    public function getAllProdutos() {
        $dbTable = $this->dbTable;
        $return = array();

        $modelCategoria = new Application_Model_Categoria;
        $modelLinha = new Application_Model_Linhas;
        $modelImagePath = new Application_Model_ImagePathProdutos();

        $rows = $dbTable->fetchAll()->toArray();


        foreach ($rows as $row) {
            $dao = new Application_Model_DAO_Produtos();
            $dao->setIdProdutos($row['idProdutos']);
            $dao->setNome($row['nome']);
            $dao->setCodigo($row['codigo']);
            $dao->setDescricao($row['descricao']);
            $dao->setStatus($row['status'] ? 1 : 0);


            $model = $dbTable->find($dao->getIdProdutos())->current();
            $cores = $model->findManyToManyRowset('Application_Model_DbTable_Cores', 'Application_Model_DbTable_CoresProdutosHasProdutos')->toArray();

            foreach ($cores as $cor) {
                $daoCor = new Application_Model_DAO_Cores();
                $daoCor->setIdCores($cor['idCoresProduto']);
                $daoCor->setNomeCor($cor['nomeCor']);
                $daoCor->setHex($cor['hex']);
                $dao->addCor($daoCor);
            }

            $model = $dbTable->find($dao->getIdProdutos())->current();
            $tamanhos = $model->findManyToManyRowset('Application_Model_DbTable_Tamanhos', 'Application_Model_DbTable_TamanhosHasProdutos')->toArray();

            foreach ($tamanhos as $tamanho) {
                $daoTamanho = new Application_Model_DAO_Tamanhos();
                $daoTamanho->setIdTamanhos($tamanho['idTamanhos']);
                $daoTamanho->setTamanho($tamanho['tamanho']);

                $dao->addTamanho($daoTamanho);
            }


            $categoria = new Application_Model_DAO_Categoria();
            $categoria->setIdCategoria($row['idCategoria']);
            $categoria = $modelCategoria->getCategoriaById($categoria);

            $dao->setCategoria($categoria);

            $linha = new Application_Model_DAO_Linhas();
            $linha->setIdLinha($row['idLinha']);
            $linha = $modelLinha->getUserById($linha);

            $dao->setLinhas($linha);
            $dao = $modelImagePath->getImagesByProdutoId($dao);

            //$cores =;
            $return[] = $dao;
        }
        return $return;
    }

    public function getProdutoById(Application_Model_DAO_Produtos $produto) {
        $dbTable = $this->dbTable;

        $modelCategoria = new Application_Model_Categoria;
        $modelLinha = new Application_Model_Linhas;
        $modelImagePath = new Application_Model_ImagePathProdutos();

        $select = $dbTable->select()->where('idProdutos = ?', $produto->getIdProdutos());

        $row = $dbTable->fetchRow($select)->toArray();

        $produto->setIdProdutos($row['idProdutos']);
        $produto->setNome($row['nome']);
        $produto->setCodigo($row['codigo']);
        $produto->setDescricao($row['descricao']);

        $model = $dbTable->find($produto->getIdProdutos())->current();
        $cores = $model->findManyToManyRowset('Application_Model_DbTable_Cores', 'Application_Model_DbTable_CoresProdutosHasProdutos')->toArray();

        foreach ($cores as $cor) {
            $daoCor = new Application_Model_DAO_Cores();
            $daoCor->setIdCores($cor['idCoresProduto']);
            $daoCor->setNomeCor($cor['nomeCor']);
            $daoCor->setHex($cor['hex']);
            $produto->addCor($daoCor);
        }

        $model = $dbTable->find($produto->getIdProdutos())->current();
        $tamanhos = $model->findManyToManyRowset('Application_Model_DbTable_Tamanhos', 'Application_Model_DbTable_TamanhosHasProdutos')->toArray();

        foreach ($tamanhos as $tamanho) {
            $daoTamanho = new Application_Model_DAO_Tamanhos();
            $daoTamanho->setIdTamanhos($tamanho['idTamanhos']);
            $daoTamanho->setTamanho($tamanho['tamanho']);

            $produto->addTamanho($daoTamanho);
        }
        $produto->setStatus($row['status'] ? 1 : 0);

        $categoria = new Application_Model_DAO_Categoria();
        $categoria->setIdCategoria($row['idCategoria']);
        $categoria = $modelCategoria->getCategoriaById($categoria);

        $produto->setCategoria($categoria);

        $linha = new Application_Model_DAO_Linhas();
        $linha->setIdLinha($row['idLinha']);
        $linha = $modelLinha->getUserById($linha);

        $produto->setLinhas($linha);
        $produto = $modelImagePath->getImagesByProdutoId($produto);

        return $produto;
    }

    public function getAllProdutosByCategoriaId(Application_Model_DAO_Categoria $categoria) {

        $return = array();
        $dbTable = $this->dbTable;

        $select = $dbTable->select()->where('idCategoria = ?', (int) $categoria->getIdCategoria())->where('status = ?', 1);

        $modelCategoria = new Application_Model_Categoria;
        $modelLinha = new Application_Model_Linhas;
        $modelImagePath = new Application_Model_ImagePathProdutos();

        $rows = $dbTable->fetchAll($select)->toArray();

        foreach ($rows as $row) {
            $dao = new Application_Model_DAO_Produtos();
            $dao->setIdProdutos($row['idProdutos']);
            $dao->setNome($row['nome']);
            $dao->setCodigo($row['codigo']);
            $dao->setDescricao($row['descricao']);
            $dao->setStatus($row['status'] ? 1 : 0);

            $categoria = new Application_Model_DAO_Categoria();
            $categoria->setIdCategoria($row['idCategoria']);
            $categoria = $modelCategoria->getCategoriaById($categoria);

            $dao->setCategoria($categoria);

            $linha = new Application_Model_DAO_Linhas();
            $linha->setIdLinha($row['idLinha']);
            $linha = $modelLinha->getUserById($linha);

            $dao->setLinhas($linha);
            $dao = $modelImagePath->getImagesByProdutoId($dao);

            //$cores =;
            $return[] = $dao;
        }
        return $return;
    }

    public function getAllProdutosByLinhaId(Application_Model_DAO_Linhas $linha) {

        $return = array();
        $dbTable = $this->dbTable;

        $select = $dbTable->select()->where('idLinha = ?', (int) $linha->getIdLinha())->where('status = ?', 1);

        $modelCategoria = new Application_Model_Categoria;
        $modelLinha = new Application_Model_Linhas;
        $modelImagePath = new Application_Model_ImagePathProdutos();

        $rows = $dbTable->fetchAll($select)->toArray();

        foreach ($rows as $row) {
            $dao = new Application_Model_DAO_Produtos();
            $dao->setIdProdutos($row['idProdutos']);
            $dao->setNome($row['nome']);
            $dao->setCodigo($row['codigo']);
            $dao->setDescricao($row['descricao']);
            $dao->setStatus($row['status'] ? 1 : 0);

            $categoria = new Application_Model_DAO_Categoria();
            $categoria->setIdCategoria($row['idCategoria']);
            $categoria = $modelCategoria->getCategoriaById($categoria);

            $dao->setCategoria($categoria);

            $linha = new Application_Model_DAO_Linhas();
            $linha->setIdLinha($row['idLinha']);
            $linha = $modelLinha->getUserById($linha);

            $dao->setLinhas($linha);
            $dao = $modelImagePath->getImagesByProdutoId($dao);

            //$cores =;
            $return[] = $dao;
        }
        return $return;
    }

}

